03 GPIO
up的视频讲解从一个引脚的内部结构入手,看懂四种输入和四种输出方式,以及程序如何读写电平。
1 GPIO 如何连接芯片内外
GPIO 是通用输入输出端口。输入时,芯片读取外部电路的状态;输出时,芯片控制外部电路的电平。一个引脚能做什么,取决于它内部启用了哪条通路。

PA0 表示 A 端口的第 0 个引脚。GPIO 配置涉及端口时钟、输入输出模式,以及数据寄存器。课程使用库函数完成配置,但理解内部结构后,函数的作用就不再抽象。
2 输入:把外部电压变成可读取的状态
保护、上下拉与施密特触发器
输入先经过引脚相关的保护电路。保护器件不能代替正确的电压匹配,外部信号仍应满足芯片引脚的电气要求。

如果一个数字输入既没有外部驱动,也没有上拉或下拉,它的电平可能不确定。上拉让默认状态趋向高电平,下拉让默认状态趋向低电平。

经过数字输入通路处理后,电平状态进入输入数据寄存器 IDR,CPU 便可以读取。模拟信号则需要保留电压的连续变化,不走相同的数字整形通路。
四种输入模式
| 模式 | 内部通路的区别 | 在课程中的理解方式 |
|---|---|---|
| 浮空输入 | 不启用内部上拉、下拉 | 外部电路负责提供确定的电平 |
| 上拉输入 | 启用上拉 | 没有外部拉低时,默认读取高电平 |
| 下拉输入 | 启用下拉 | 没有外部拉高时,默认读取低电平 |
| 模拟输入 | 使用模拟通路 | 把电压交给 ADC 等模拟外设 |

配置寄存器用不同位组合选择模式。学习时先回答“外部接了什么、空闲时应该是什么状态”,再决定输入方式,比直接记选项更容易。
3 输出:主动驱动或释放引脚
推挽输出
推挽输出通过上、下两个驱动器件切换,使引脚能够主动输出高电平,也能够主动输出低电平。课程中的普通点灯控制就可以用这种方式理解。

开漏输出
开漏输出保留下拉能力:导通时把引脚拉低,断开时释放引脚。释放不等于主动输出高电平,高电平通常由外部上拉电阻形成。

这种结构允许多个设备共用一条信号线,后面的 IIC 课程会继续使用这个概念。
普通输出与复用输出
| 模式 | 谁决定输出时序 | 电气结构 |
|---|---|---|
| 通用推挽 | GPIO 数据控制 | 推挽 |
| 通用开漏 | GPIO 数据控制 | 开漏 |
| 复用推挽 | 定时器、串口等外设 | 推挽 |
| 复用开漏 | IIC 等外设 | 开漏 |
“复用”改变的是控制来源;推挽或开漏描述的是输出级的电气行为。这两件事应分开理解。
4 程序怎样改变输出
输出数据寄存器 ODR 保存输出状态。直接修改其中一位时,常会涉及先读、修改、再写的过程。
BSRR 提供单独的置位、复位操作:低 16 位用于置位,对应的高 16 位用于复位。这样可以明确地改变指定引脚,而不必重写其他引脚的状态。
